package com.cn.wanxi.util;

import com.cn.wanxi.dao.CompanyDao;
import com.cn.wanxi.dao.NavDao;
import com.cn.wanxi.model.CompanyModel;
import com.cn.wanxi.model.NavModel;
import com.cn.wanxi.model.PersonModel;
import com.cn.wanxi.model.XiaoMingModel;
import com.cn.wanxi.service.CompanyService;
import com.cn.wanxi.service.NewsService;

import java.util.Arrays;

public class ReadMe {
    /**
     * 2022-4-6
     * 第二阶段任务：把自己当作客户，把你认为需要修改的数据提取出来，放入数据层
     * 通过servlet+jsp渲染到页面上
     * ----------------------------------------------------
     * 1.创建项目：file--new  ---project--java---web application--
     * 2.创建目录结构：首先必须有前后端
     * 前端：web的目录结构
     * 1）img  图片
     * 2）css 样式
     * 3）js 动作
     * 4）html 页面  针对所有后台语言都可以使用，可以跨语言
     * 5）jsp 页面（只针对Java） asp（c#,.net）  php（php）
     * jsp的目的就是为了让Java程序员少操心前端页面，不用去学js
     *
     * 后端：src的目录结构
     * 第二阶段：servlet+jsp，所以需要将前端html全部修改成jsp页面
     * 如果启动项目后，css无法正常显示，1）清缓存2）删除out文件3）重新启动tomcat
     * 1）servlet  和页面相关  就是和页面(jsp)一一对应
     * 2）service  服务逻辑层
     * 3）model  对象层   实体层
     * 4）dao  数据实现层
     * 5）util  工具层
     * -----------------------------------
     * servlet的三层架构：
     * 1）页面控制层  servlet
     * 2）服务逻辑层  service
     * 3）数据实现层  dao
     * 3.创建前端web目录：
     * 1）如果没有web文件夹：这直接点击项目右键，添加支持，选择web application，
     *      然后直接复制第一阶段的所有内容，粘贴到web目录结构
     * 2）如果不用添加支持，直接手动添加web目录，怎么办？
     *     1:创建web文件夹
     *     2：创建WEB-INF文件夹
     *     3：创建lib
     *     4：创建web.xml
     * 3）添加web支持
     *      1：file---project  structrue--facets  指向web.xml和web目录
     *      2：file---project  structrue--artifacets
     * 4）启动当前项目
     *      1.安装工具（tomcat）
     *      2.下载tomcat  安装软件 不用去配置
     *      3.配置tomcat
     *----------------------------------------------------------------------------
     * 第二阶段：创建项目：搭建环境
     * 1.创建项目，创建目录结构，最主要的是web目录结构
     * 2.配置tomcat，然后启动如果能够进入index.jsp这个页面表示搭建环境成功
     * --------------------------------------------------------------------------
     * ------------------------------------------------------------------
     * 怎么将页面的数据提取出来？放入到哪个地方？怎么放？
     * 按照什么方式进行提取？
     *   ../img/logo.jpg
     *   029-9999999
     *   home.jsp
     *   网站首页
     *   company.jsp
     *   公司介绍
     *   会发现这些数据挺乱？能不能进行分类？
     *   1.可能按照楼层来分类
     *   2.可能按照几栋来分类
     *   3.可能按照快递的大小来分类
     *   4.按照人头来分类，
     *   5.按照姓名来分类
     *   6.按照电话号码来分类
     *   ---------------------------------------------
     *   都是按照对象来分类：什么是对象？
     *   怎么来理解对象？
     *   有叶子，绿色，不高  树
     *   有叶子，绿色，很高  树
     *   有叶子，绿色，没有生命   可能是电线杆
     *   ---------------------------
     *   你通过什么方式来区分不同的对象？
     *   你怎么判断是同一个对象呢？
     *   -----------------------------
     *   是不是越具体，越能表示同一类对象
     *   是不是功能差不多，代表同一类对象
     *   --------------------------------------------
     *   怎么判断当前项目有哪些对象？
     *   判断功能（模块）的不同，那么就是不同的对象
     *   如果功能（模块）相似，则表示同一个对象
     *   新闻对象
     *   产品对象
     *   公司对象
     *   导航对象
     *   如果你们有需求文档？那么这些对象就已经在需求文档里面了:E-R图
     *   今天任务：
     *   1.你们要去理清思路：当前项目由哪些对象，每个对象的关系，将er图画出来？
     *   2.那么将每个对象取一个英文名，
     *   3.对象里面有哪些特征，也用英文名写出来？
     *   --------------------------
     *   今天讲了哪些知识点：
     *   1.项目搭建
     *   2.目录结构认识
     *   3.后台的三层架构
     *   4.html修改为jsp页面
     *   5.jsp页面引用jsp页面
     *   6.E-R图理解
     *   7.对象的理解
     *
     */
    /**
     * 2022-4-7
     * 简历：不要写精通Java基础，精通spring
     * 写熟悉Java基础，
     * 比如你不会VUE，那么就不要讲vue写入简历
     * ------------------------------------
     * 1.讲课有点混乱
     * 2.听起来有点费劲，可能难度有点大
     * 3.一次性时间少一点
     * 4.罗列一下主题
     * -----------------------------------
     * 比如我如果直接讲正确的路线，一直到项目结束：
     * 因为作为程序员：要么再改bug，要么再改bug的路上
     * 我这么讲就是将你们平时再写项目中出现的bug（错误）
     * 在讲课的时候给大家经历一遍，然后告诉你们遇到这个问题怎么办？
     * ---------------------
     * 模仿：
     * 1.不要先去理解里面的原因，
     * 2.不要将自己以前的习惯带过来
     * 3.一定要跟着我的思路来学习，
     * 4.我的思路是在项目的基础上，是在工作的基础上，是在无数零基础学员的基础上
     * 5.一般Java如果大学直接学可能要学三年，而我们只学三个月，而且还比大学学的多，学的好
     * 6.所以我们会浓缩很多东西，而且对于零基础的同学要比其他同学更加努力，改多花时间练习
     * 7.正常情况下，技术阶段是三个月，如果对于零基础或者基础稍微差一点可能时间会更长
     * 8.不要有消极心理，状态
     * 9.试错的最好的方式：就算花钱学别人的东西
     * 10.既然要学别人的东西，那么至少别人有一些优势，所以应该放下自己以前的知识，行为，习惯
     * 11.要去融入别人的思路，我的思路是总结了很多人很多事的经验
     * -----------------------------------
     * 以前线下的时候上课时间是两个小时
     * 现在对你们上课的进度我已经慢了起码一倍
     * 而且时间也在一个半小时左右。
     * 我的进度是跟你们学习的进度一直，
     * 我把我自己当作零基础，如果我遇到问题我改怎么办？
     * 假如你们组十个人，如果有三个人左右进度慢，没有跟上，那么我的进度在这三个人
     * -------------------------------------
     * 我每次讲课的进度都是根据你们组的状态来，所以主题不好列，
     * 所以，我们上课和其他地方上课不一样，其他地方每节课必须讲这么多，而我们是你们能够进步多少来讲
     * 但是，我每个阶段都在跟大家强调任务需求；
     * ------------------------------------------
     * 每讲一个知识点：我都给大家做了一个总结：描述
     * --------------------------------------------------------
     * 理解对象：
     * 区分对象最简单的方式：就算看功能是否相同？
     * 判断是否为一个对象？看特征是否属于当前对象？
     * 判断是否属于一类对象？
     * ----------------------------------------
     * 如果你们对第一阶段div的用法有一点理解，那么对于第二阶段就更好理解
     * 项目永远是阶段性迭代：
     * 面试的时候：
     * 面试官问？
     * 你们的项目周期？项目时间？项目需求？项目描述？项目阶段？项目里程碑？项目过程？
     * 不仅仅是学习技术（技术其实很简单，无非就算CRUD，增删改查）你们要学习项目的流程
     * 你们的简历千万不要写**管理系统，**电商系统,**支付系统，**办公系统，只要写这个都是最基础的
     * 或者会认为你们是从培训机构出去的，不好找工作，
     * ------------------------------------------------------
     * 如果对象已经理解的差不多了，就是能够正确的画出ER图
     * 那么现在就将ER图转换为Java对象
     * 在生活中，不同对象之间是否有联系？这么联系？
     * 比如：产品和菜系
     * 对象和对象之间可能会存在一个对应多个对象
     * 就算说，在这里我们对象之间关系大概简单分为
     * 一对多   一个菜系对应多个产品
     * 一对一   一个用户对应一个角色
     * 多对一   多个新闻对应一个新闻类型
     * 多对多   多个学生对应多个老师
     * -------------------------------------------
     * 昨天你们将对象的英文名都写出来了。那么转换为对象时，就直接创建Java类即可
     * 那么这个类放在什么地方？Java后台的对象层，或者实体层（model）（entity，bo，vo，pojo，domain）
     * 对象命名规则：大驼峰式命名：
     * 1.如果一个对象有多个英文单词组成，那么每一个单词的首字母大写ProductNav
     * 2.每一个对象的命名最好（建议）加包名ProductNavModel(第五阶段之前必须加包名)
     * 注意：
     * 1.命名时不要有拼音，特殊字符，数字，下划线，（所以最好的方式全英文）
     * 2.不要缩写 ，如果名为ProductNavModel，缩写为pnm，谁都看不懂，所以全部写出来
     * 3.要见名知意。见到名称知道意思
     * ----------------------------------------------------
     * 对象层的名称应该全是名词，而且是单数
     * 对象已找好，那么这么将对象的特征放入到Java里面来？
     * Java对象的组成？由哪些部分来组成？
     * 开始认识Java类？
     * Java类和对象之间的关系是什么？
     * 类是对某一类事物的抽象描述，
     * 而对象用于表示现实中该类事物的个体
     * --------------------------------------------------
     * 对象是有具体的数据，而类是指某一类
     * 生活中的对象描述叫做特征，Java对象的描述叫做属性
     * 右边英文名词叫做属性名：
     * 属性名的命名规则：小驼峰 linePhone
     * 除了第一个首字母小写，其他首字母大写就算小驼峰式命名规范
     * Java注释：对于一段代码的解释
     * Java注释有三种情况
     * 1.单行注释  只注释一行  //
     * 2.多行注释  对多行进行注释
     * 3.文本注释  一般用于类，属性，方法
     * 注释对于Java代码来说没有任何意义，只是用于开发人员查看或者维护
     * 多写注释，特别是自己不懂的代码一定要写注释
     * -----------------------------------------------------------
     * 就算我们需要这么来描述类？通过属性来表述
     * 所以属性这么创建？
     * 一般情况下属性由变量名和数据类型组成
     * Java的数据类型又是什么？
     * 内置数据类型：
     * 引用数据类型：所有大驼峰式命名的都可以理解为引用数据类型（类，接口，枚举，注解...）
     * -----------------------------------------
     * 今日任务：
     * 1.将所有类全部创建好
     * 2.将类里面的属性全部创建好
     * 3.预习Java基础
     * 4.你可以选择去看视频（其他网站或者培训机构的视频Java基础）
     * ---------------------------------------------------------
     * 你们要做的就算多做项目，多练习代码，不要觉得烦，不要觉得代码差不多，
     * 你们现在是锻炼性格的时候，要稳
     * ----------------------------------------------------
     * 你们来这里，是为了学习解决问题的方案，解决问题的能力
     */
    /**
     * 2022-4-8
     * E-R图  主要目的：
     * 1.就算找到第一阶段的对象：
     * 2.同时将对象的特征用中文描述出来
     * 3.为了你们以后做中级软件工程师以上职位会涉及到的需求文档设计
     * ----------------------------------
     * 将E-R图和Java的类进行比较：将E-R图转换位Java类
     * 1.在做E-R图的时候，将每个对象和特征都用英文字符表示
     * 2.将E-R图的对象名写成类名，特征写成属性名
     * ---------------------------------------------
     * 如果已经起好名字了，那么这个名字放在哪个地方？
     * 你把放在那个地方叫做容器：
     * 所以我们把属性名字前面的叫做容器；
     * 容器也分为不同的容器：根据装的东西不同放入不同的容器
     * Java将这种容器又称为数据类型：
     * Java里面存入的东西都称为数据：不同的数据对于不同的容器，又对应不同的数据类型
     * 所有的数据都可以放在一个容器里面：引入数据类型：为了更好的区分数据类型
     * 我们将数据类型又做了细分：
     * 多个文字组合起来就是字符串String
     * 数字我们应该放到那个地方呢？
     * 数字又细分为：整数（小整数，短整数，整数，长整数），小数（单精度，双精度）
     * 小整数  byte  长度   1个字节
     * 短整数   short          2个字节
     * 整数   int              4个字节
     * 长整数  long            8个字节
     * 计算机只能认识0和1
     * 所以，就需要将其他的数字转换为0和1   平时我们见到的数字是以10为单位
     * 所以我们称为十进制  如果只有0和1，那么为二进制
     * 如果我们用0-9加上a到f  叫做十六进制
     * -------------------------------------
     * 所以，十进制转换为二进制
     * 一个字节一般用八位0和1组成    0000 0000             1111 1111
     * 一般情况下，我们的数字又分为正数和负数
     * 所以：Java又分为有符号位（有正负数之分）和无符号位（无正负数之分）
     * 0000 0000 表示十进制的0    0000 0001  表示十进制的1
     * 如果是有符号的，那么最左边的为符号位  0代表正数，1代表负数
     * 1000 0001   -1
     * --------------------------------
     * 如果是无符号位：那么一个字节的取值范围是多大？ 0-255  只要最右边是1，则代表奇数
     * 如果是有符号位：取值范围：-128~127 将0划入正数
     * -------------------------------------------
     * 如果是小数
     * 单精度  float   4个字节
     * 双精度  double  8个字节
     * 只不过double表示（定义的时候需要在变量值后面加D）
     * 只不过float表示（定义的时候需要在变量值后面加F）
     * 以后注意：只要是小数都去加一个符号，最好都是加大写
     * ---------------------------------
     * 有时候我们会有一种数据，只有两个结果，是，否，正确，错误
     * 布尔值的数据类型：boolean；
     * 字符串是由多个文字组合而成，那么单个文字呢？
     * char  字符  字符必须由内容，而且必须用单引号引起来
     * 字符只能有一个字符组成，可以位字母，数字，特殊字符，汉字
     * -----------------------------------------------------------------
     * 一般如果我们在类里面定义数据类型时，都用引用类型，不要用基本数据类型
     * 但是，我们还是想让别人知道我现在定义的是整数，怎么办？
     * 所以，Java里面提供基本数据类型的包装类，分别对应：
     * 左边是基本类型，右边是对应的引用类型
     * byte   Byte
     * short   Short
     * int     Integer
     * long    Long
     * float   Float
     * double  Double
     * boolean  Boolean
     * char     Character
     * 所有的引用类型都是以大写开头的
     * 那么既然是包装类，说明包装类是对基本数据类型的包装，
     * 所以包装类里面有很丰富的代码,是对基本类型的封装，功能肯定比基本类型强大
     * 建议：所有类下面的数据类型全部用引用类型
     * -------------------------------------------
     * 以后关于金钱的数据类型：统一用BigDecimal 英文她比float和double更加准确
     * 既然是基本数据类型和引用数据类型，
     * 那么如果他们都同时等于某一个数，那么他们是否相等？
     * -----------------------------------------------------
     * 类型转换是指将基本类型转换位引用类型？
     * int a=1;Integer b = 1; b=a;
     * 或者将长整型转换位短整型？
     * 自动转型，强制转型
     * 向上转型，向下转型
     * --------------------------------------------------------------
     * 所有的类，我们都不要将代码暴露给别人，不能让别人调用，那么我们要学会封装
     * 所以，Java类一般我们会给别人一个权限，就是我想不想给你看我的东西
     * 权限有很多种：全部公开，公开一部分，不公开，某些人可以看
     * 对于Java的类也是一样，我们可以选择性公开
     * 所以Java就引入一个权限修饰符：
     * public   公共  所有人都可以访问
     * private  私有  只有自己能够访问
     * protected  受保护   一般只有子孙才能访问
     * 默认不写  只有自己院子里面的人可以访问
     * --------------
     * 1.所有类的属性默认不公开
     * 2.无论在那个地方，public都可以被其他类使用，调用
     * 3.private 只能自己类访问
     * 4.默认不写只能在当前包访问
     * 以后所有的实体类，只做set和get方法
     * 1.所有属性全是私有
     * 2.设置get和set方法
     * 对访问对象设置set赋值，和get取值方法即可
     * 给别人提供一个接口：这个接口即别人能够访问的地址
     * 如果设置成public表示不安全
     * --------------------------------------------------------
     * 今天知识点：
     * 1.数据类型 ：基本，引用
     * 2.二进制和十进制相互转换------原码，补码，反码（当我们学到位运算符）
     * 3.数据类型转换
     * 4.权限修饰符
     * --------------------------
     * 明天可能会讲到知识点：
     * 1.运算符
     * 2.语法结构
     * 3.数组
     *
     */
    /**
     * 2022-4-11
     * 认识对象  E-R图
     * 将对象抽象出类  创建类，添加属性
     * 权限修饰符
     * ------------------------------------
     * 1.创建一个公司对象，并对公司对象进行赋值
     * 2.那么代码应该写在那个地方？
     * servlet 的三层架构：
     * 1）页面控制层   肯定是控制某个页面
     * 2）服务逻辑层   肯定是写逻辑代码的
     * 3）数据持久层   肯定是保存数据的地方
     * ------------------------
     * 4）实体层 model（vo,do,pojo,dto,domain）
     * 5)工具层  util
     * 逻辑：有条理，有思路 ，有固定的一条线
     * 其实逻辑，就算按照某个大家认为的规则进行办事情
     * 大家普遍认为是对的，那么我们就认为符合逻辑
     * -----------------------------
     * 一个对象对应一个服务逻辑层，对于一个数据持久层，对应一个实体层
     * 就算服务逻辑层就是为了得到某个东西，某个具体的值
     * 我刚刚在CompanyService用来set和get，他们是什么？方法，
     * 方法的目的是什么？就是为了做事情：
     * 属性代表我们当前对象的特征，方法代表我们对象的行为
     * 如果要想知道别人是否已经做了某个行为，是不是应该给别人一个反馈
     * 所以，Java方法（行为）如果要别人给你一个反馈，那么就需要有一个返回值！
     * 权限（是否要给你知道）   返回值类型（返回什么给你）   行为的名字（到底做了什么事情）
     * public                   CompanyModel             getCompanyModel() {
     * return companyModel;//具体返回给别人什么
     * }
     * 如果想要companyModel不为null。则调用之前需要对对象进行赋值
     * //        如果直接打印对象，则打印出来的是地址：（内存里面的地址）
     * //        如果想把具体值打印出来，则需要将对象转换为字符串
     * //        怎么将对象转换为字符串？
     * //        我们所有对象都有一个父对象？Object类，里面有一个toString方法，就是将对象转换为字符串
     * ----------------------------------------------------------
     * public void setCompanyModel(CompanyModel companyModel)
     * 小括号里面的是什么？参数,这个参数可有可无
     * void  表示不需要你的反馈，就是无返回值,就是最后不需要用return
     * 类里面属性名不能相同，但是方法名可以相同，不过里面的参数类型不能一样，个数不能一样
     * 这种情况下，我们将这两个方法叫做重载
     * -----------------------------------------------
     *  companyModel.setLogo("aaa"); 这里面的具体值，应该放在数据持久层
     *
     *      * 类下面的属性叫做全局变量
     *      * 方法里面的叫做局部变量
     *      * 只要是全局变量，在创建对象时，都会在内存里面的分配空间（大小）
     *      * 如果是局部变量，则只在调用改方法时，才会去内存里面分配空间
     * --------------------------------------------------------------------------
     *     * 如果不想把值放在方法里面，又不担心内存的损耗，
     *      * 就想放在最上面用于维护方便，那么怎么办呢？
     *      * 所以，这里提供另外一个容器来存储数据：
     *      * 常量:常量的定义？无法改变的量   public static final String NET = "admin.com";
     *      这里必须要有 static final，
     *      * 常量的命名规则：全部大写,如果两个单词，则用下划线隔开
     * ---------------------------------------------------------------------------------
     * 1.为什么要把代码写入逻辑层（公认）
     * 2.在逻辑层我们做了一个事情，就是对对象的封装（赋值）
     * 3.我们写了一个方法，讲了方法的简单定义和用法
     * 4.对具体对象进行赋值CompanyDao
     * 5.对值可以写在方法里面public String getLogo() {
     *         return "../img/logo.jpg";
     *     }
     * 6.可以写成常量： public static final String NET = "admin.com";
     * 7.获取对象值的不同调用方式：
     *      1）如果是方法，则需要创建一个对象，通过对象.方法名()调用
     *       CompanyDao companyDao = new CompanyDao();
     *         companyDao.getLogo();
     *      2）如果是常量：类.属性名（常量命）进行调用CompanyDao.NET
     * --------------------------------------------------------------------
     * 今日任务：
     * 1.日报（今天做了什么，看了什么，我主要想知道你们每天干了什么）
     * 2.将公司信息的数据进行封装到服务逻辑层
     * --------------------------------
     * 明日安排：
     * 1.数组
     * 2.语法结构（if else  for  while ）
     * 3.关键字  static ，final
     *
     */
    /**
     * 2022-4-12
     * 逻辑层：写逻辑代码
     * 数据层：装数据的地方
     * -------------------------
     * 逻辑层：分组数据的逻辑，所以，我们昨天得到公司对象
     * 1.可以通过set方式进行赋值，然后通过get方式进行取值，得到公司对象
     * 2.可以直接通过方法的返回值得到公司对象
     * 在逻辑层里面我们一般习惯用第二种方式，第一种一般用于model层
     * ----------------------------------------------------
     * 页面的数据来源于Java后台：怎么将数据返回给前端页面呢？
     * 页面控制层：servlet：一个页面对应一个servlet层
     * servlet和jsp通过什么方式进行联系的？
     * 1.页面怎么找到后台的？通过地址：@WebServlet("/home")
     * 2.后台怎么找到页面的？通过响应给前端一个地址： req.getRequestDispatcher("/jsp/home.jsp").forward(req, resp);
     * 不过，找到前端页面有两种形式：
     * 1）第一种反馈，直接说在某个地方见面
     * 2）第二种反馈，找到某个地方，顺便带点东西回去
     * 这两种只能有一种生效，不能同时存在
     * ------------------------------
     * 第二阶段用到是servlet框架：那么我们必须得到框架的支持？
     * 那么我们必须要引用servlet的包
     * 一般情况下，如果别人已经封装好了，提供给你直接用，
     * 那么它会将这些封装好了的类打包成.jar包
     * 所以，我们需要找到servlet的jar包，并且添加到当前项目
     * -------------------------------------------
     * 如果我们需要用它，那么必须要引入它的类，或者重写，重载里面的方法
     * 如果别人提供的方法是通用的用法，或者是大家公认的代码，则看你会继承它的东西
     * 如果很多具体对象抽象出来一个公用的对象，
     * 那么具体对象是子类，公用对象是父类
     * 那么我们现在的HomeServlet数据具体的某一个类，会继承父类的类extends HttpServlet
     * extends关键字叫做继承 HttpServlet叫做父类
     * 所以，我们需要重写父类的方法
     * 找到父类的doGet方法，并删掉方法里面的代码
     * --------------------------------------------
     * 第二阶段：不能让用户直接访问jsp页面，因为页面没有数据
     * 什么情况下需要重启tomcat呢？
     * 1）新建一个文件或者文件夹
     * 2）新建一个方法
     * 3）如果每次更新都无法达到我们的效果
     * -----------------------------------------
     * 反馈给前端，顺便带点东西回去
     * req.getRequestDispatcher("/jsp/home.jsp").forward(req, resp);
     * req表示容器，装东西的地方req.setAttribute("logo", logo);
     * "logo"里面的logo（key值）表示记号：（地址）
     * logo表示value值，要传递给前端的值
     * 前端通过固定的格式来找到后台提供的地址${logo}
     * --------------------------------------------------------
     * 后台的结构一定要区分，分别知道每一个包要干什么事情
     * 1.servlet  和页面一一对应，并将数据返回给前端
     * 2.service  和对象一一对应，主要封装对象提供给servlet调用，写逻辑代码
     * 3.dao      和对象一一对应，主要用于存放对象的具体的值，不做任何逻辑代码
     * 4.model    和对象一一对应，主要用于抽象出对象，并给对象属性，然后提供set和get方法
     * 5.util     工具层，主要写公用的代码
     * -----------------------------------------------------------------
     * 对于公司页面
     * 1.创建CompanyServlet
     * 2.提供前端访问后台的地址@WebServlet("/company")
     * 3.继承父类，并重写方法doGet
     * 4.反馈给前端页面，并顺便带点东西给前端
     * 5.带什么呢？公司信息，公司信息在哪里来？service
     * 6.调用服务逻辑层得到公司信息
     * 7.将公司信息放入容器里面
     * ------------------------------------------
     * 新闻页面和其他页面对于公司信息的做法同上；
     * 面试：首页信息和公司信息和新闻信息这几个页面，你发现了什么？
     * 1.发现了共同的代码：可不可以将这些代码缩减成一个公用代码，其他地方直接用即可
     * 2.能不能只做一遍，其他地方都可以不做，页面也可以得到数据呢？提供一个权限（范围更大的容器）
     * 比req（request）范围更大的是session
     * 说明session在关掉浏览器后，就不存在了，
     * 说明session的范围只在浏览器打开的时候
     * req的范围只在当前页面
     * 我会思考，在关掉浏览器后，能不能打开还在？
     * 那么会不会有更大的容器呢？application
     * req.setAttribute("companyModel", companyModel);
     * req.getSession().setAttribute("companyModel", companyModel);
     * req.getServletContext().setAttribute("companyModel", companyModel);
     * ----------------------------------------------
     * servlet的四大作用域：page，request请求对象，session会话期对象，application应用程序对象
     * 一般情况下page现在没有用了。
     * 四大作用域一般考的是作用范围:
     * 注意：但清除缓存后，会出现什么效果？
     * -----------------------------------------------
     * 一般情况下，我们这里用req即可，只出现在当前页面？
     * 其他会占用内存和硬盘资源，导致脏数据太多
     * ---------------------------------
     * 当我们代码有一样的情况下，我们看你会想方设法提取公用代码？怎么提取？
     * 1.创建一个类。类名应该和功能一致
     * 2.如果多个地方都在用，或者都同时调用当前的方法，为了避免创建无数个对象，
     *      所以用static，这个意思就是之创建一次，在在内存里面分配一次空间
     * -----------------------------------
     * 注意：
     * 1.为什么刚刚哪个地方需要用默认不写的权限修饰符？
     * 2.为什么我的公用代码不写在servlet外面的包？
     * ------------------------------------------
     * 今日任务：
     * 1.将公司信息完整的显示在jsp页面
     * 2.日报
     * 3.预习数组
     * 4.预习关键字
     * 5.预习语法结构
     * 6.复习第二阶段已经讲过的知识点
     *
     *
     */
    /**
     * 2022-4-13
     * 一个完整的数据流程：
     * 1.前端浏览器访问页面：访问的是后台的注解地址@WebServlet("/home")
     * 2.后台的servlet层：
     *      1）调用服务逻辑层 CompanyService companyService = new CompanyService();
     *      2）得到数据 CompanyModel companyModel = companyService.setCompanyModel();
     *      3）将数据放到容器里面 req.setAttribute("companyModel", companyModel);
     *      4）将装有数据的容器返回给前端req.getRequestDispatcher("/jsp/home.jsp").forward(req, resp);
     * 3.后台的service层：封装公司信息
     * 4.后台的dao层：存放数据的地方，service层得到数据的地方
     * ------------------------------------------------------------
     * 面试的时候：
     * 1.servlet重定向和页面转发的区别？
     * 2.servlet的生命周期？
     * 3.servlet的作用域？
     * ----------------------------------------------------
     * 导航数据的展示：
     * 1.model   抽象出对象的类 NavModel
     *           1.抽象对象时，应该以最小原则，最简单原则，单一职责，原子原则
     *           2.里面的属性修饰符一定是私有的，
     *           3.数据类型一定是引用类型：因为引用类型的默认值为null，dao层可能会有null的值
     * 2.dao    将数据放到dao层
     *          1.怎么将数据放入dao层？
     *          2.怎么表示？
     *          3.数据都是一样的，那么我能不能将这些数据放入一个大一点的容器？
     *          当我们去搜索资料时，有两种情况
     *          1）数组
     *          2）集合
     * 面试时：
     *      你学的是Java，但是我们这里招聘的是c语言工程师？
     *      1.语言都是相通的，我相信我能很快的适应
     *      2.以前我做过类似的项目，哪个项目用js来做的，当时我js也不怎么会，不过很快就适应
     *      3.我通过和同事进行深入交流和自我的知识提升
     * -----------------------------------------------------------------------
     * 数组？
     * 1.定义是什么？Java 语言中提供的数组是用来存储固定大小的同类型元素
     *      数组是一种数据结构，用来存储同一类型的集合，
     *      也就是说数组包含的变量必须是相同类型！
     *      1）固定大小2）类型相同
     *      固定大小：数组的长度    类型相同：数据类型一致
     * 2.数据的创建？怎么创建？
     *      1）静态定义dataType[] arrayRefVar = {value0, value1, ..., valuek};
     *      String [] arrays={"a","b","c"};
     *      2）动态定义dataType[] arrayRefVar = new dataType[arraySize];
     *      String [] arrays=new String[3];
     *      arrays[0]="a";
     *      arrays[1]="b";
     *      arrays[2]="c";
     *      3)如果只是定义数组的长度，不做任何事情，那么数组里面元素默认值为null
     *      String [] arrays=new String[3]; 等同于String [] arrays={null,null,null};
     * 3.数组的转换：将数组转换为字符串Arrays.toString(NavDao.TITLES)
     * --------------------------------------------------------------------
     * Arrays是jdk自带的类
     * toString是Arrays的方法
     * static在这里的作用：
     *      1，只创建一次，在内存里面只分配一次空间
     *      2，可以直接通过类名.方法名调用
     * Object[] a 和String[] a 的区别是什么？
     * Object范围至少比String 大：数据类型相互转换
     * 所有应用类型的父类都是Object类
     * if 语句
     * for循环
     * StringBuilder b = new StringBuilder();
     *         b.append('['); 字符串拼接    String a="[";String b="]";String c=a+b;
     *  面试时：
     * 1. String a="[";String b="]";String c=a+b;创建了几个对象？
     *  用==比较字符串是否相等，比较的内容是地址和值
     *  用equals只比较值是否相等
     *  java里面没有===三个等号
     *  StringBuilder只创建一次对象，内存消耗比较小
     *  2.StringBuilder和String的区别？
     *  3.StringBuilder和String和StringBuffer的区别？
     *  --------------------------------------------------------------
     * 1.动态定义数组，赋值的时候，如果不去执行当前的方法，则数组里面没有值，
     * 需要调用当前方法
     * 2.如果不想调用，就想加载类的时候直接执行当前方法，则需要创建静态代码块
     * ------------------------------------------------------------------------
     * 今日知识点;
     * 1.抽象对象NavModel
     * 2.NavDao
     * 3.数组：定义方式
     * 4.数组的取值赋值
     * 5.数组的字符串转换
     * 6.StringBuilder和String和StringBuffer的区别？
     * 7.静态代码块
     * ----------------------------------------------
     * 今日任务：
     * 1.将你们的对象抽象出来，属性弄上
     * 2.将数据放入dao层
     * 3.只要你发现和导航一样的（类型差不多的）都需要用数组把数据放入dao层
     * 4.如果有多个显示新闻的地方怎么办？
     *      1）一个对象对于一个service对应一个dao层
     *      2）一个页面对应一个servlet层
     *      3）那么在dao层里面用不同的变量进行命名即可
     * 5.熟悉语法结构：对java基础小案例进行作业，熟悉for循环，熟悉数组，熟悉if else
     * -------------------------------------------------------------
     * 明天讲解：
     * 导航的逻辑封装：for，forEach
     * jsp的for循环
     *
     *
     *
     */
    /**
     * 2022-4-14
     * 一个类里面我们应该包含那些内容？
     * 关键字？就是jdk自带的字符 一般用颜色进行区分，而且全是小写
     * 请列举10个关键字？
     * 八大基本类型？四个权限修饰符？包？类？return？this？super？
     * final？implements？extend？static？void？new？throw？continue？break？
     * for？if？else？null？synchronized？throws？instanceof？true？false？
     * while？do？case？go？
     * --------------------------------------------------
     * 1）包  package com.cn.wanxi.model; 包名要全部小写
     *          com.wanxi.model  可以省略 cn
     *          com 代表国际
     *          cn   国内
     *          wanxi  公司
     *          model  模块
     * 2）类名   public class CompanyModel
     *          定义类名：类名大驼峰式命名：
     *          所有引用类型都是大驼峰
     * 3）属性   private String logo;
     * 4）方法    public String getLogo() {
     *         return logo;
     *     }
     * 5）代码块{}
     * ---------------------------------------------------
     * 一个完整的属性：  public static final String NET = "admin.com";
     * 访问修饰符（权限修饰符）四大权限
     * 非访问修饰符（特征修饰符）
     * static 修饰符，用来修饰类方法和类变量。
     *static 修饰符
     *      静态变量：
     *          static 关键字用来声明独立于对象的静态变量，
     *          无论一个类实例化多少对象，它的静态变量只有一份拷贝。
     *          静态变量也被称为类变量。局部变量不能被声明为 static 变量。
     *
     *      静态方法：
     *          static 关键字用来声明独立于对象的静态方法。
     *          静态方法不能使用类的非静态变量。
     *          如果想要使用，则需要创建一个对象，然后通过对象进行调用new Object().属性
     *          如果想要调用类的静态变量，那怎么调用呢？类.属性
     *          静态方法从参数列表得到数据，然后计算这些数据。
     * 一般static在什么时候用？
     *      1）如果不想每次对类进行实例化的时候重新创建一个对象，那么用static
     *      2）如果我们对当前这个类经常使用，每次使用都去创建一个对象，
     *          那么这个对象会存在那个地方呢？内存，所以不要去创建多个对象，用static
     *      3）一般工具类里面会使用static,就是大家会经常调用的类，用static
     *
     * final 修饰符，用来修饰类、方法和变量，
     *      final   修饰的类不能够被继承，
     *                  继承：父类有一些共同特点或者行为，需要子类去继承：去使用
     *                     一般继承后，子类就算不写方法，也可以调用父类的方法
     *              修饰的方法不能被继承类重新定义，
     *                  如果子类的方法上面有@Override，表示子类的方法覆盖了父类的方法
     *                  如果不想让子类覆盖父类的方法，怎么办？
     *                  @Override表示重写：解释，判断,不起任何作用，有没有它无所谓
     *              修饰的变量为常量，是不可修改的。
     *
     * abstract 修饰符，用来创建抽象类和抽象方法。
     *
     * synchronized 和 volatile 修饰符，主要用于线程的编程。
     * ------------------------------------
     * 变量：一般分为全局变量和局部变量；
     * 全局变量：类下面的属性，紧挨着类的变量
     *          全局变量：
     *                  类变量  有static修饰
     *                  实例变量  无static修饰
     * 局部变量：方法里面的变量
     * 变量的目的：就是为了赋值，
     * 如果将生活着的对象抽象到java中
     * 生活着的特点叫做Java的属性
     * 生活着的行为 叫做Java的方法
     * 既然是属性，那么就叫做变量（常量）
     * ---------------------------------------------------------
     * 今日任务：
     *  1.将所有页面数据全部放入dao层
     *  2.将所有数据在service层进行封装
     *  3.在servlet层将代码全部放入req里面
     * ----------------------------------
     * 今日知识点：
     * 1.类的组成部分
     * 2.命名规范
     * 3.关键字列举
     * 4.static
     * 5.final
     * 6.变量
     * 7.继承
     * 8.重写：重载和重写的区别？
     * 9.for循环（对象的取值赋值）
     * -----------------------------
     * 下一节课知识：
     * 1.页面取servlet的数组的值
     * 2.数组的练习
     * 3.while循环
     * 4.for增强循环
     */
    /**
     * 2022-4-18
     * 上一节课，我们将导航数据已经得到，
     * 我们需要在页面拿到servlet的数据
     * 因为后台传递到前端的是数组，所以我们需要在前端进行遍历
     * jsp也是第三方的支持：只要是第三方，一般情况下我们都需要第三方给一个包，接入到Java里面
     * 这里需要jstl标签库
     * 注意：前端永远不要写Java后台的代码：违背了Java的低耦合
     * Java 求奇偶数？
     * -----------------------------------------------
     * 导航数据展示
     * 1.model
     * 2.dao 层
     * 3.service  封装数据
     * 4.servlet
     * 5.下载jstl jar包
     * 6.就是jsp页面  <c:forEach items="${navModels}" var="model" varStatus="mm">
     * -----------------------------------------------
     * 构造方法：定义？为什么要用？
     * 目的，就是创建对象：调用对象里面的属性和方法
     * NewsService navService = new NewsService();
     * //这个new NewsService()就是调用的构造方法
     * ------------------------------------------
     * 构造方法是方法名和类名相同：每个类都默认了一个构造方法   public NewsService(){
     * }
     * 构造方法有没有返回值？肯定有：
     * 如果类里面有一个有参数的构造方法，则默认无参数的构造方法失效：
     * 如果还需要调用无参数的构造方法，需要添加一个无参数的构造方法即可
     * -----------------------------------------------------------------
     * 构造方法，代码块，静态代码块，他们的执行顺序是什么？
     * 永远先执行静态代码块，然后在执行代码块，然后在执行构造方法
     * 静态代码块只要类加载的时候就会去执行
     * ------------------------------------------------------
     * 预习：
     * 抽象和接口
     * file类的相关方法
     */
    /**
     * 2022-4-21
     * 第二阶段：任务需求：将自己当作客户（用户），
     * 你认为哪些文字或者图片需要修改，那么就把文字或者图片提取出来
     * 按照对象的方式提取出来，放入Java后台
     * ---------------------------------------------------------
     * E-R图：第二阶段，根据E-R图来创建对象
     * 对象：变量名：命名规范
     * 数据类型：基本类型和引用类型
     * 基本类型：8种
     * byte
     * short
     * int
     * long
     * float
     * double
     * char
     * boolean
     * 默认值，取值范围，字节数
     * 二进制和十进制的相互转换
     * 基本类型和包装类
     * 基本类型主要用于局部变量：（方法里面）
     * 包装类：如果是属性
     * 在第四阶段数据库的时候会出错：
     * 属性名用大写？会出错.计算机会把属性名当作类名，找不到属性
     * java命名规范：
     * 类名：大驼峰  LinePhone
     * 包名：全小写  linephone
     * 属性，方法：小驼峰 linePhone
     * 常量：全大写：如果有多个单词则用下划线 LINT_PHONE
     * 注意：不要缩写：findByUsernameAndPassword：fbyap(缩写是错误的写法)
     * 命名要见名知意：不要有数字，不要有特殊字符，应该全英文
     * 权限修饰符：四个
     * private      只有自己类可以调用
     * protected   只有子类才能调用
     * public    所有类可以调用
     * 默认不写（default不要写）  同包可以调用
     * --------------------------------------------------------
     * 将数据提取出来放入dao层：
     * servlet的三层架构：
     * 页面控制层   servlet
     * 服务逻辑层  service
     * 数据持久层  dao  将所有数据保存到dao层
     * -------------------
     * 模型层（对象层）  model（pojo，vo，do，dto，entity）
     * 工具层 util
     * ------------------------------------------
     * 如果只是保存到dao层：可以直接用 private String logo="../img/logo.jpg";
     * 就是说我们必须要在常量区开辟一个空间，如果比较少，而且用的地方比较多，
     * 那么我们最好将这个值设为常量
     * String a="aaa";
     * String a=new String("aaa");
     * jdk5之后会有一个缓存区：
     *
     * static
     * final
     * == 值和地址都相等：基本类型是这个
     * equals只比较值引用类型是这个：Object是所有引用类型的基类
     * 实际应用种，一定记得equals左边的不能为null
     * String username="";   如果要判断这个username不为空，怎么做？
     * "".equals(username);不要写成username.equals("");
     * ------------------------------------------
     * static:修饰属性和方法：表示独立的区域：调用它直接用类名.属性名
     * 一般用于工具类：调用次数比较多，如果用new关键字创建对象时会创建大量的对象占用内存
     * 则直接用static，值用创建一次对象就用static
     * final的用法：
     * 修饰类 该类不能被继承
     * 修饰属性  表示常量：最终的，无法改变的，一般和static一起表示常量
     *      常量值一定不能修改吗？
     *      在没有给常量进行赋值的情况下可以修改一次
     * 修饰方法
     *      表示方法不能被重写
     * ----------------------------------
     * 封装数据：前端页面需要数据，那么我们应该这么将数据传递到前端？
     * service：写逻辑的地方：思路，判断，预演。
     * 语法结构：for循环，if else
     * 赋值：对某一个变量设置值
     * 取值：取得某一个变量的值
     * 为什么要封装数据？因为在servlet里面需要掉用：
     * 为什么不把这些代码放在一起？各自的功能要分开写，
     * 遵循一个原则：单一职责：一个类只做关于类自己的事情，一个方法只做一件事情：分工明确
     * --------------------------------------------------
     * servlet  和页面相关：
     * 所有前端的数据都从后台来，那么用户访问的时候应该直接给用户一个接口（地址）
     * @WebServlet("/home")提供给前端的一个接口
     * 需要告诉前端我要把数据发送到哪个页面？
     *  req.getRequestDispatcher("/jsp/home.jsp").forward(req, resp);
     *  页面转发和重定向的区别？
     *  数据这么发送？
     *  作用域？request，session，application
     * ------------------------------------------------------------------
     * 将数据放到作用域（容器里面）
     *  req.setAttribute("companyModel", companyModel);
     *  前端进行接收： ${companyModel.logo}
     * -----------------------------------------------------------------
     * 思路：
     *      1.创建对象（model）
     *      2.创建数据（dao）
     *      3.封装对象数据（service）
     *      4.得到数据（servlet）
     *      5.展示数据（jsp页面）
     * ----------------------------------------------------
     * 导航：
     *     如果有多个元素，我们想封装在一个容器里面：数组
     *     两种定义数组的方式
     *     1.静态定义：直接赋值String[] data={"aa","bbb","ccc"};
     *     2.动态定义：我们先给你一个大小，不装任何值
     *     String[] data=new String[6];但是，这里只有空间，没有任何值
     *     所以，如果想要使用，则必须对数组进行赋值
     *     data[0]="aa";数组的赋值
     *     String name=data[1];
     *     当我们对数组进行赋值时，必须要调用执行赋值代码，
     *     所以，这些代码必须写道方法里面
     *     所以，我们就想，当加载这个类的时候，它就已经在执行这个代码，怎么办？
     *     就需要将这个赋值代码放入静态代码块：
     *     这里就给大家讲了静态代码块和代码块和构造方法的加载顺序？
     *--------------------------------------------------------
     * 先讲思路，在讲技术
     * 总分总
     * 总：我上节课，这节课大概要做什么
     * 分：根据当前的项目分成无数个知识点
     * 总：总结刚刚讲过的知识点和问题
     * ------------------------------
     * 走捷径：
     */
//   static String name="";
    public static void main(String[] args) {
//        name.equals("aa");
//        int a=1;//将1赋值给a
//        Integer b=1;
//        System.out.println(a==b);
//        Integer c=1;
//        System.out.println(b==c);
//        Integer d=100;
//        Integer e=100;
//        拆箱和装箱
//        所有整数默认类型是int
//        所有小数默认类型是double
//        Integer e=new Integer(100);
//        System.out.println(d==e);
//        Integer f=10000;
//        Integer g=10000;
//        System.out.println(f==g);
//        System.out.println(NewsService.NAME);
//        System.out.printlnInt();
//        System.out.printlnFloat();
//        System.out.println(1);
//        System.out.println(1.1);

//        new NewsService("s");
//        int a = 17;
//        String aa = "";

//        if (a % 2 == 1) {
//            aa = "奇数";
//        } else {
//            aa = "偶数";
//        }

//        System.out.println("a" + (a % 2 == 1 ? "奇数" : "偶数"));
//        PersonModel aa=new XiaoMingModel();
//        aa.run();
//      new ReadMe().name="aa";
//        CompanyService companyService = new CompanyService();
//        既然有返回值，那么我们怎么来得到这个返回值呢？
//        我们可以给刚刚的返回值一个接收对象
//        NavDao navDao=new NavDao();
//        String a="[";
//        String b="[";
//        a，b分别指向常量区的同一个地址
//        String c=a+b;
//        System.out.println(a==b);
//        System.out.println(c==(a+b));
//        如果想知道两个字符串是否相等，用equals
//        System.out.println(c.equals(a+b));
//        String e=new String("]");
//        String f=new String("]");
        //e，f分别指向堆的不同地址
//        System.out.println(e==f);
//        Object[] a=null;
//        System.out.println(Arrays.toString(NavDao.TITLES));
//        NavDao.setHrefs();//能不能不用写这个代码，我hrefs同样有值呢？
//        加载类的同时，要去执行里面方法的代码，那怎么办？
//        当类加载时，如果想要直接执行，则需要在类里面创建一个静态的方法块
//        System.out.println(Arrays.toString(NavDao.HREFS));
//        System.out.println(new NavModel());
//        NavModel navModel=new NavModel();
//        navModel.setTitle(null);
//        CompanyModel companyModel = new CompanyModel();//创建一个新的对象，用于赋值
//        companyService.setCompanyModel(companyModel);//对刚刚的对象进行赋值
//        companyModel = companyService.getCompanyModel();//拿到刚刚赋值的对象
//        要学会打断点（断言）
//        System.out.println(companyModel);
//        CompanyModel companyModel = companyService.setCompanyModel();
//        如果直接打印对象，则打印出来的是地址：（内存里面的地址）
//        如果想把具体值打印出来，则需要将对象转换为字符串
//        怎么将对象转换为字符串？
//        我们所有对象都有一个父对象？Object类，里面有一个toString方法，就是将对象转换为字符串

//        CompanyModel companyModel=new CompanyModel();//创建一个对象
//        companyModel.//通过对象对里面的属性进行调用
//        companyModel.setAddress("aaaaaaaa");
//        companyModel.address="afds";
//        System.out.println(companyModel.address);
//        System.out.println(companyModel.getAddress());
//        new PersonModel();
//        char a=' ';
//        int a = 1;//赋值，将1赋值给a
//        short s=1;
//        a=s;//自动转型
//        s= (short) a;//不能直接装，因为容器大小；如果要装，就要进行强制转换
//        alt+enter  提示，万能，只要报错，都可以用这个快捷键
//        Integer b = 1;//赋值，将1赋值给b
//        b=a;//代表将a的值赋值给b；
//        a=b;//代表将b的值赋值给a；

//        System.out.println(a == b);//打印到控制台

    }
}
